package com.silence.gmall.product.domain.repository.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.silence.gmall.base.TableDataInfo;
import com.silence.gmall.product.assembler.SkuInfoFactory;
import com.silence.gmall.product.domain.entity.SkuInfo;
import com.silence.gmall.product.domain.mapper.SkuInfoMapper;
import com.silence.gmall.product.domain.repository.SkuInfoRepository;
import com.silence.gmall.product.dto.SkuInfoDto;
import com.silence.gmall.product.enums.OnSaleEnum;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;

/**
 * @Author silence
 * @Description 针对表【sku_info(库存单元表)】的数据库操作Repository实现
 * @Date 2025-08-17 16:28:16
 */
@Slf4j
@Repository
@RequiredArgsConstructor
public class SkuInfoRepositoryImpl extends CrudRepository<SkuInfoMapper, SkuInfo>
        implements SkuInfoRepository {

    /**
     * 库存单元工厂
     */
    private final SkuInfoFactory skuInfoFactory;

    /**
     * 获取sku分页列表
     *
     * @param page  当前页码
     * @param limit 当前页数
     * @return sku分页列表
     */
    @Override
    public TableDataInfo<SkuInfoDto> pageSkuInfo(Long page, Long limit) {
        return skuInfoFactory.pageSkuInfo2TableSkuInfoDto(page(new Page<>(page, limit)));
    }

    /**
     * 上下架
     *
     * @param skuId      skuId
     * @param onSaleEnum 上下架状态
     */
    @Override
    public void changOnSale(Long skuId, OnSaleEnum onSaleEnum) {
        // 更新sku_info表的is_sale字段
        // 使用枚举的 ordinal() 方法获取序号（0 或 1）
        update(new LambdaUpdateWrapper<SkuInfo>()
                .eq(SkuInfo::getId, skuId)
                .set(SkuInfo::getIsSale, onSaleEnum.ordinal()));
    }

    /**
     * 根据SKU ID查询详情信息
     *
     * @param skuId skuId
     * @return 详情信息
     */
    @Override
    public SkuInfoDto getSkuInfoById(Long skuId) {
        return skuInfoFactory.skuInfo2SkuInfoDto(getOptById(skuId).orElse(null));
    }
}